#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#define endl '\n'
#define int long long
#define pii pair<int, int>
using namespace std;

// 已知
int n, m, u, v;
vector<int> adj[200005];
// 未知
int fa[200005], cnt[200005]; // 存放老祖宗，和连同分量的大小
set<int> s;

int find(int x)
{
    if (x == fa[x])
        return x;
    return fa[x] = find(fa[x]);
}
void unite(int x, int y)
{
    x = find(x), y = find(y);
    if (x != y) fa[x] = y, cnt[y] += cnt[x];
}

void input()
{
    // 建图
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 1; i <= n; ++i)
    {
        fa[i] = i;  // 祖宗竟是我自己
        cnt[i] = 1; // 我自己是一个连同分量
    }
}

void solve()
{
    for (int i = 1; i <= n; ++i)
    {
        for (int v : adj[i])
        {
            if (v < i) unite(i, v); // 把比i小的节点都并到到i上
            else s.insert(find(v)); // 否则就是一个单独的老祖宗，把他加入集合
        }
        if (s.size()) s.erase(i); // 把自己从集合中删除
        cout<<(cnt[find(1)]==i ? s.size() : -1)<<endl;
        // if (cnt[find(1)] == i) cout << s.size() << endl; // 如果1下面有i个节点就需要删掉集合里所有的多于的东西
        // else cout << -1 << endl; // 那就不能完成从顶点1通过遍历边可以到达的顶点集合正好由k顶点1,2,…,k 组成。
    }
}

signed main()
{
    input();
    solve();
    return 0;
    return 0;
}